home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 19.zip
/
BS1 part 19
/
Laserdisk.adf
/
Logo#1
/
sim.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-05-06
|
8KB
|
265 lines
#define TRUE 1
#define FALSE 0
#define MAX 50
#define STRECKE 100
#define VOID void
#define nl printf("\n")
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Diese Programm simuliert eine moegliche Loesung fuer das *
* Roboter-Problem aus AMIGA-Special Ausgabe Nr.2/88 *
* *
* Erstellt am 1.2.1988 *
* Zuletzt geaendert am --.--.-- *
* *
* Autor : Manuel Guerrero, 1 Berlin 20, Nordenhamer Str. 18, *
* Tel.:331 67 60 *
* *
* (C) Copyright 1988 Manuel Guerrero *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Funktionen */
int nimm_max();
int nimm_min();
int ueberall_eine();
int vorher_eine();
VOID bringe_max_weiter();
VOID hole_naechste();
VOID fahre500();
/* Batterie: wo und wie voll */
struct Batterietyp {
int menge;
int ort;
};
/* globale Variable */
struct Batterietyp Batterie[MAX]; /* Batterien */
int anz_b; /* Anzahl der Batterien */
int punkt; /* aktueller Standort */
void main() {
/* Vereinbarungen */
int i;
int ende;
int weiter;
/* Ende Vereinbarungen */
/* Eingabe */
do {
printf("Anzahl der Batterien : ");scanf("%d",&anz_b);nl;
}
while((anz_b < 1) || (anz_b > MAX));
/* Initialisierung */
punkt = 0; /* Wir fangen von vorne an */
for(i=0;i<anz_b;i++) {
Batterie[i].menge = 500; /* Alle Batterien sind voll */
Batterie[i].ort = 0; /* ...und liegen am Anfang */
}
/* Sonderfaelle abfangen */
if(anz_b == 1) fahre500(); /* mit einer kommt man nicht weit */
else {
ende = FALSE; /* noch sind wir nicht fertig */
while(ende == FALSE) /* Bis nichts mehr geht */
{
ende = ueberall_eine(); /* Ende, wenn vor Standpunkt ueber- */
/* all nur noch eine Batterie steht */
if(ende == TRUE) { /* wenn fertig, Endspurt */
/* nimm leerste Batterie, lade dich auf und verschwinde mit der 500er*/
i=nimm_min();
printf("nimm Batterie %d\n",Batterie[i].menge);
printf("lade Akku 100km\n");
Batterie[i].menge -= STRECKE; /* Batterie entleeren */
printf("lege Batterie weg\n");
/* nimm die vollste, dann weg */
i=nimm_max();
printf("nimm Batterie %d\n",Batterie[i].menge);
printf("fahre 100km vorwaerts\n");
Batterie[i].ort++; /* volle Batterie jetzt eine Punkt weiter */
punkt++; /* 1 Stuetzpunkt weiter mit Energie der alten B. */
fahre500(i); /* noch 500km mit der vollen Batterie */
} /* if ende = TRUE then */
else { /* Wenn noch nicht zuende */
weiter = vorher_eine();/* ist der vorherige Platz noch zu gebrauchen?*/
if (weiter == TRUE) { /* Wenn vorher keine verwendbare B. liegt */
bringe_max_weiter(); /* mit der leersten aufladen und die ... */
/* vollste eins weiter schleppen */
} /* if weiter = TRUE then */
else { /* wenn noch brauchbare B. auf Punkt vorher */
hole_naechste(); /* mit der schwaechsten aufladen und zurueck*/
bringe_max_weiter(); /* wieder die vollste weiterbringen */
} /* if weiter = TRUE else */
} /* if ende = TRUE else */
} /* while ende = FALSE */
} /* if anz_b = 1 else */
/* Weite ausrechnen und ausgeben */
punkt *= STRECKE;
printf("ich bin %dkm weit gefahren\n",punkt);
} /* main() */
/***** Hauptprogrammende **********************************************/
/**********************************************************************/
/* vollste Batterie einen Punkt weiter bringen */
VOID bringe_max_weiter()
{
int i;
/* mit der schwaechsten Batterie aufladen */
i = nimm_min();
printf("nimm Batterie %d\n",Batterie[i].menge);
printf("lade Akku 100km\n");
Batterie[i].menge -= STRECKE;
printf("lege Batterie weg\n");
/* Die staerkste Batterie weiterbringen */
i = nimm_max();
printf("nimm Batterie %d\n",Batterie[i].menge);
printf("fahre 100km vorwaerts\n");
printf("lege Batterie weg\n");
Batterie[i].ort++;
punkt++;
}
/**********************************************************************/
/* Batterie vom letzten Punkt holen */
VOID hole_naechste()
{
int i;
/* mit der schwaechsten Batterie aufladen */
i = nimm_min();
printf("nimm Batterie %d\n",Batterie[i].menge);
printf("lade Akku 100km\n");
Batterie[i].menge -= STRECKE;
printf("lege Batterie weg\n");
/* einen Punkt zurueck fahren */
printf("fahre 100km zurueck\n");
punkt--;
}
/**********************************************************************/
/* Endebedingung: Ueberall nur noch eine Batterie ? */
int ueberall_eine()
{
int i;
static int anz_auf[200];
/* Sonderfaelle abfangen */
if(punkt == 0) {
if(anz_b ==2) return(TRUE);
else return(FALSE);
}
for(i=0; i<200; i++) anz_auf[i] = 0; /* Initialisieren */
/* Anzahl der B. auf jedem Punkt auszaehlen */
for (i = 0; i<anz_b; i++)
if(Batterie[i].menge > 0) anz_auf[Batterie[i].ort]++;
/* Auswertung */
for (i = 0; i<punkt; i++)
if(anz_auf[i] > 1) return(FALSE);
if(anz_auf[punkt] == 2) return(TRUE);
else return(FALSE);
}
/**********************************************************************/
/* noch eine brauchbare Batterie auf vorherigem Punkt ? */
int vorher_eine()
{
int i,mini_b;
static int anz_auf_vor;
anz_auf_vor = 0;
if(punkt == 0) return(TRUE); /* Sonderfall abfangen */
/* Auszaehlen */
for (i = 0; i<anz_b; i++)
if((Batterie[i].menge > 0) && (Batterie[i].ort == (punkt-1)))anz_auf_vor++;
if (anz_auf_vor > 1) return(FALSE);
mini_b = nimm_min(); /* schwaechste Batterie auf aktueller Position */
for(i=0;i<anz_b;i++)
/* wenn auf vorherigem Punkt noch eine brauchbare B. ist... */
if((Batterie[i].ort == (punkt-1)) &&
(Batterie[i].menge > (Batterie[mini_b].menge+100))) return(FALSE);
return(TRUE);
}
/**********************************************************************/
/* staerkste Batterie auf aktueller Position */
int nimm_max()
{
int max,i;
int nr = -1;
max = 0;
for (i=0; i<anz_b; i++)
if ((Batterie[i].ort == punkt) && (Batterie[i].menge > max)){
max = Batterie[i].menge;
nr = i;
}
return(nr);
}
/**********************************************************************/
/* schwaechste Batterie auf aktueller Position */
int nimm_min()
{
int min,i;
int nr = -1;
min = 501;
for (i=0; i<anz_b; i++)
if((Batterie[i].ort == punkt)&&(Batterie[i].menge < min)
&&(Batterie[i].menge >= 100)) {
min = Batterie[i].menge;
nr = i;
}
return(nr);
}
/**********************************************************************/
/* Endspurt */
void fahre500(nr)
int nr;
{
int i;
for (i=1; i<=5; i++) {
printf("lade Akku 100km\n");
Batterie[nr].menge -= STRECKE;
printf("fahre 100km vorwaerts\n");
Batterie[nr].ort++;
punkt++;
}
}
/**********************************************************************/